#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mqueue.h>
#include <string.h>
#include <time.h>


int main(void){
  char *mq_name="/p_c_mq";
  struct mq_attr attr;
  attr.mq_curmsgs=0;
  attr.mq_flags=0;
  attr.mq_maxmsg=10;
  attr.mq_msgsize=100;
  // 创建或打开
  int mqd = mq_open(mq_name,O_CREAT|O_RDONLY,0644,&attr);
  if(mqd==-1){
    perror("mq_open");
    exit(EXIT_FAILURE);
  }
  char read_buff[100]={0};
  struct timespec time_info;
  size_t read_count=0;
  // 一直接收，直到生产者端不再发送
  while(1){
    memset(read_buff,0,100);
    clock_gettime(0,&time_info);
    time_info.tv_sec+=86400;//设置1天超时
    // 从消息队列接收数据
    if(mq_timedreceive(mqd,read_buff,100,0,&time_info)==-1){
      perror("mq_timedsend");
      continue;
    }
    // 判断接收到的数据是普通业务数据还是停止通信的消息
    if(read_buff[0]==EOF){
      printf("接收到生产者停止通信的信号,准备退出....\n");
      break;
    }
    printf("消费者收到来自生产者的消息:%s\n",read_buff);         
  }
  // 通信结束后，关闭消息队列描述符
  close(mqd);
  // 由消费者端操作unlink
  unlink(mq_name);
  return 0;
}